package net.cyl.manager.Impl;

import com.alibaba.cloud.commons.lang.StringUtils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import net.cyl.manager.ProductOrderManager;
import net.cyl.mapper.ProductOrderMapper;
import net.cyl.model.ProductOrderDO;
import net.cyl.vo.ProductOrderVO;
import net.cyl.vo.ProductVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Component
public class ProductOrderManagerImpl implements ProductOrderManager {
    @Autowired
    private ProductOrderMapper productOrdermapper;
    @Override
    public int add(ProductOrderDO productOrderDO) {
        return productOrdermapper.insert(productOrderDO);
    }

    @Override
    public ProductOrderDO findByOutTradeNoAndAccountNo(String outTradeNo, Long accountNo) {
        return productOrdermapper.selectOne(new QueryWrapper<ProductOrderDO>()
                .eq("out_trade_no", outTradeNo)
                .eq("account_no", accountNo)
                .eq("del", 0));

    }

    @Override
    public int updateOrderPayState(Long accountNo, String outTradeNo, String newState, String oldState) {
         return productOrdermapper.update(null, new UpdateWrapper<ProductOrderDO>()
                .eq("account_no", accountNo)
                .eq("out_trade_no", outTradeNo)
                .eq("state", oldState)
                .set("state", newState));
    }

    @Override
    public Map<String, Object> page(int page, int size, Long accountNo, String state) {
        Page<ProductOrderDO> pageParam = new Page<>(page, size);

        IPage<ProductOrderDO> ipage ;

        if(StringUtils.isBlank(state)){
            ipage = productOrdermapper.selectPage(pageParam, new QueryWrapper<ProductOrderDO>().eq("account_no", accountNo).eq("del", 0));
        }
        else{
            ipage = productOrdermapper.selectPage(pageParam, new QueryWrapper<ProductOrderDO>()
                    .eq("account_no", accountNo)
                    .eq("state", state)
                    .eq("del", 0));
        }
        List<ProductOrderDO> records = ipage.getRecords();
        List<ProductOrderVO> collect = records.stream().map(obj -> {
            ProductOrderVO productOrderVO = new ProductOrderVO();
            BeanUtils.copyProperties(obj, productOrderVO);
            return productOrderVO;
        }).collect(Collectors.toList());
        Map<String, Object> result=new HashMap<>(3);
        result.put("current_data",collect);
        result.put("total_records",ipage.getTotal());
        result.put("total_page",ipage.getPages());
        return result;
    }

    @Override
    public int del(Long accountNo, Long productOrderId) {
        return productOrdermapper.update(null, new UpdateWrapper<ProductOrderDO>()
                .eq("account_no", accountNo)
                .eq("id", productOrderId)
                .eq("del", 0)
                .set("del", 1));
    }
}
